#include <SDL.h>
#include <stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
const int SCREEN_WIDTH = 1000;
const int SCREEN_HEIGHT = 500;
// 假设这是DataPoint结构体定义，包含两个成员
typedef struct DataPoint {
    double x;
    double y;
}DataPoint;
// 定义结构体用于存储函数参数
typedef struct FunctionParams {
    double params[4];  // 最多存放三次函数的4个参数，根据实际使用
    int num_params;     // 参数个数
} FunctionParams;

//生成样本点并保存至“some.dat"文件中 
void generate_dataset(const char* filename, int type, double a, double b, double c, double d, int num_points);
// 从文件读取数据到DataPoint数组
int readDataFromFile(const char *filename, DataPoint **data,int num_points);
//用ls算法拟合函数，分为一次函数、二次函数、三次函数三个函数实现 
// 计算一次函数拟合的系数
void linearRegression(DataPoint *data, int n, double *a0, double *a1);
// 计算二次函数拟合的系数
void quadraticRegression(DataPoint *data, int n, double *a0, double *a1, double *a2);
// 计算三次函数拟合的系数
void cubicRegression(DataPoint *data, int n, double *a0, double *a1, double *a2, double *a3);
//用gd算法拟合函数 
FunctionParams gradientDescentFit(DataPoint *data, int num_data, int t);
//计算残差平方和（Residual Sum of Squares，RSS）
double residualSumOfSquares(DataPoint *data, int num_data, FunctionParams params, int t);
//计算决定系数（Coefficient of Determination） 
double calculateRSquared(DataPoint *data, int num_data, FunctionParams params, int t);
//SDL函数设置
// 初始化SDL相关环境
int init_SDL(SDL_Window **window, SDL_Renderer **renderer);
// 关闭SDL相关资源
void close_SDL(SDL_Window *window, SDL_Renderer *renderer);
// 绘制坐标轴（简单的x轴和y轴）
void draw_axes(SDL_Renderer *renderer);
// 绘制样本点
void draw_points(SDL_Renderer *renderer,DataPoint *points, int num_points);
// 绘制一次函数曲线
void draw_linear_function(SDL_Renderer *renderer, double a1, double b1);
// 绘制二次函数曲线
void draw_quadratic_function(SDL_Renderer *renderer, double a2, double b2, double c2);
// 绘制三次函数曲线
void draw_cubic_function(SDL_Renderer *renderer, double a3, double b3, double c3, double d3);

